package com.webserver.controller;

import com.webserver.core.annotations.Controller;
import com.webserver.core.annotations.RequestMapping;
import com.webserver.http.HttpRequest;
import com.webserver.http.HttpResponse;
import com.webserver.vo.User;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 用来处理和用户相关的业务操作
 */
@Controller
public class UserController {
    //保存    所有用户信息的目录的名字
    private static String userDirName="./users/";

    static {
        File uesrDis=new File(userDirName);

        if(!uesrDis.exists()){
            uesrDis.mkdirs();
        }
    }
    /**
     * 用来处理用户注册操作
     * @param request
     * @param response
     */
    @RequestMapping("/myweb/regUser")
        public void reg(HttpRequest request,HttpResponse response){  ;
            System.out.println("开始处理用户注册...");
            //1从request中获取用户表单上的注册信息
            String username=request.getParameter("username");
            String password=request.getParameter("password");
            String nickname=request.getParameter("nickname");
            String ageStr=request.getParameter("age");
            System.out.println(username+" "+password+" "+nickname+" "+ageStr);
            //必要的验证工作,保证注册的信息不能为空,否则只响应注册失败的提示页面
            //失败页面:reg_error.html 居中显示一行文字:注册失败,输入信息有误,请重新注册
            if(username==null||password==null||nickname==null||ageStr==null||
                    !(ageStr.matches("[0-9]+"))){
                response.setEntity(new File("./webapps/myweb/reg_error.html"));
                return;
            }
            /*
             判断是否为重复用户,如果重复用户则直接响应页面:reg_have_user.html
             该页面居中显示一行字,:该用户预存在,请重新户注册
             */
            File file=new File(userDirName+username+".obj");
            if(file.exists()){
                response.setEntity(new File("./webapps/myweb/reg_have_user.html"));
                return;
            }
                int age=Integer.parseInt(ageStr);

                //2将该用户信息写入磁盘保存
                User user=new User(username,password,nickname,age);
                try(
                        ObjectOutputStream oos=new ObjectOutputStream(
                                 new FileOutputStream(file)
                        )
                ){
                    oos.writeObject(user);
                    //注册成功
                    response.setEntity(new File("./webapps/myweb/reg_success.html"));

                }catch(IOException e){
                    e.printStackTrace();
                }
                //3设置response响应注册结果页面
                System.out.println("用户注册处理完毕!!!!");
            }
            @RequestMapping("/myweb/loginUser")
    public void login(HttpRequest request,HttpResponse response){
        System.out.println("用户开始登录");
        String username=request.getParameter("username");
        String password=request.getParameter("password");
        if(username==null||password==null){
            response.setEntity(new File("./webapps/myweb/login_error.html"));
            return;
        }
        File userFile=new File(userDirName+username+".obj");
        if(userFile.exists()){
            try (

                ObjectInputStream ois=new ObjectInputStream(
                        new FileInputStream(userFile))
                ){

                User user=(User)ois.readObject();

                if(user.getPassword().equals(password)){
                    response.setEntity(new File("./webapps/myweb/login_success.html"));
                    System.out.println("客户登录成功");
                    return;
                }
            }catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        response.setEntity(new File("./webapps/myweb/login_fail.html"));
    }

    /**
     * 生成展示所有注册信息的动态页面
     * @param request
     * @param response
     */
    @RequestMapping("/myweb/showAllUser")
    public void showAllUser(HttpRequest request,HttpResponse response){
        System.out.println("开始生成动态页面");
        /*
        1:将users目录下的所有,obj文件获取到,并逐个进行反序列化来得到若干的User对象.
        然后将这些User对象都存入一个List集合备用
         */
        List<User> userList=new ArrayList<>();
        File file=new File(userDirName);
        File []subs=file.listFiles(f->f.getName().endsWith(".obj")  );
        System.out.println(subs.length);
        for(File file1:subs){
            try(
                    ObjectInputStream obj=new ObjectInputStream(
                            new FileInputStream(file1)
                    )
                    ){
                userList.add((User)obj.readObject());
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        userList.forEach(System.out::println);


            PrintWriter p=response.getWriter();
            p.println("<!DOCTYPE html>");
            p.println("<html lang=\"en\">\n");
            p.println("<head>\n");
            p.println("    <meta charset=\"UTF-8\">\n");
            p.println("    <title>用户列表</title>\n");
            p.println("</head>\n");
            p.println("<body>\n");
            p.println("<center>\n");
            p.println("    <H1>用户名列表</H1>\n");
            p.println("        <table border=\"1\">\n");
            p.println("            <tr>\n");
            p.println("                <td>用户名</td>\n");
            p.println("                <td>密码</td>\n");
            p.println("                <td>昵称</td>\n");
            p.println("                <td>年龄</td>\n");
            p.println("            </tr>\n");
            for(User user:userList){
                p.println("            <tr>\n");
                p.println("<td>"+user.getSuername()+"</td>");
                p.println("<td>"+user.getPassword()+"</td>");
                p.println("<td>"+user.getNickname()+"</rd>");
                p.println("<td>"+user.getAge()+"</td>");
                p.println("            </tr>\n");

            }
            p.println("        </table>\n");
            p.println("</center>\n");
            p.println("</body>\n");
            p.println("</html>");
        //设置文件类型
        response.setContentType("text/html");

        System.out.println("动态页面生成完毕");
    }
}
